FFmpegで音声ファイルと画像1枚から動画を作成してみた
はじめに
清水です。先日ひょんなことから音声のみのmp3ファイルをYouTubeにアップロードすることがありました。 しかしYouTubeで音声のみのファイルをアップロードすることはできず、アップロードしようとすると以下の画面のように変換を促されます。
YouTubeにアップロードするには別途映像部分と合成しなければなりません。YouTubeのヘルプページには、
- Windowsユーザ向け: Windows Live ムービーメーカーの使用
- Macユーザ向け: iMovieの使用
- Youtubeのスライドショーでの動画作成
などの方法での変換方法が紹介されています。 が、映像部分はこったものである必要はなく、写真1枚の静止画状態で十分、という具合でした。そのために動画編集するのもな、、、と思いましたので、FFmpegで音声ファイル+静止画1枚からの動画を作成し、YouTueにアップロードしてみました。
本エントリではこの過程において、
- Amazon LinuxへのFFmpegのインストール方法
- FFmpegでの音声ファイル+静止画1枚からYouTubeにアップロードできる動画の作成方法
の2点をまとめてみました。
Amazon LinuxへのFFmpegのインストール方法
まずはAmazon LinuxへFFmpegをインストールして使用できるようにします。Amazon Linuxは現時点での最新版(2016.09.1)を使用しています。
手順としてはFFmpegの公式ページのCentOSへのコンパイル方法を踏襲して行います。
yumで依存関係にあるパッケージをいくつかインストールした後に、必要なライブラリならびにFFmpeg本体をインストールする、という流れなのですが、この作業をまとめて1つのスクリプトとしてみました。このスクリプトは本エントリの最後にまとめています。
また公式ドキュメントでは~/ffmpeg_sourcesなどホームディレクトリ配下へのインストールを想定していますが、/usr/local/配下へインストールするようにしています。こちらは冒頭の変数を書き換えることで変更可能です。
Amazon Linuxを起動した後、適切な権限でこのスクリプトファイルを実行します。(例えば/usr/local配下にインストールする場合はroot権限が必要となりますのでsudoで実行します。) なお、コンパイルにはそれなりに時間がかかりますのでご注意ください。
コンパイルが終了したら、ffmpegコマンドを実行して動作するか確認します。
[ec2-user@ip-172-31-17-78 ~]$ ffmpeg ffmpeg version N-82976-g7525517 Copyright (c) 2000-2016 the FFmpeg developers built with gcc 4.8.3 (GCC) 20140911 (Red Hat 4.8.3-9) configuration: --prefix=/usr/local/build/ffmpeg_build --extra-cflags=-I/usr/local/build/ffmpeg_build/include --extra-ldflags='-L/usr/local/build/ffmpeg_build/lib -ldl' --bindir=/usr/local/bin --pkg-config-flags=--static --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 libavutil 55. 43.100 / 55. 43.100 libavcodec 57. 70.100 / 57. 70.100 libavformat 57. 61.100 / 57. 61.100 libavdevice 57. 2.100 / 57. 2.100 libavfilter 6. 68.100 / 6. 68.100 libswscale 4. 3.101 / 4. 3.101 libswresample 2. 4.100 / 2. 4.100 libpostproc 54. 2.100 / 54. 2.100 Hyper fast Audio and Video encoder usage: ffmpeg [options] [[infile options] -i infile]... {[outfile options] outfile}... Use -h to get full help or, even better, run 'man ffmpeg'
FFmpegでの音声ファイルと静止画1枚からの動画の作成方法
FFmpegが利用できるようになったら、音声ファイルと静止画1枚の画像ファイルを用意して、動画を作成します。
今回の動画作成のために使用したコマンドは以下となります。
ffmpeg \ -loop 1 \ -r 30000/1001 \ -i input_picture.png -i input_audio.mp3 \ -vcodec libx264 \ -acodec aac -strict experimental -ab 320k -ac 2 -ar 48000 \ -pix_fmt yuv420p \ -shortest \ output.mp4
なかなか長いですね。。。それぞれオプションを確認すると以下のようになります。
- -loop 1
- 静止画1枚の画像を繰り返して動画にします
- -r 30000/1001
- フレームレートを指定します。29.97fpsにしています
- -i input_picture.png -i input-audio.mp3
- 入力ファイルを指定します。それぞれ画像(静止画)ファイル、音声ファイルです
- -vcodec libx264
- 動画フォーマットを指定します。H.264にしています
- -acodec aac -strict experimental -ab 320k -ac 2 -ar 48000
- 音声フォーマットを指定しています。AACで320kbps、2チャンネル、サンプリングレート48kHzとしています
- -pix_fmt yuv420p
- 出力動画の画素フォーマットを指定します
- -shortest
- 動画の長さを入力ソースが最短のもの(ここでは音声ファイル)に合わせます
- output.mp4
- 最後に出力ファイルの名称を入力します
エンコードしたファイルのYouTubeへのアップロード
エンコードができたら、ファイルを確認してYouTubeにアップロードしましょう。
アップロードは通常の手順と同様にできます。音声のみのファイルのときに出ていた動画ファイルへの変換を促すメッセージも表示されませんね。タイトルなどの情報や公開範囲、必要に応じて詳細設定を入力して公開しましょう。
実際にアップロードしてみたサンプル動画
本エントリの手順で実際にYouTubeアップロード、公開してみた動画が下記になります!
YouTubeで公開されている「動画」なのですが、映像としては静止画1枚がループしている状態であることがご確認いただけます。
まとめ
Amazon LinuxにFFmpegをインストールし、音声ファイルと1枚の静止画ファイルから動画を作成してみました。
実は数年前にもまったく同じことをFFmpegで行ったことがあるのですが、FFmpegのオプションについて記録しておらず、今回やってみるにあたりこの調査などにわりと時間をとられてしまいました。FFmepgはオプション等の指定が慣れていないとやや難しい点がありますが、こんな感じで使用実績ベースで記録にまとめて、使い方を覚えていければなと思います。
FFmpegインストール用スクリプト
本エントリで使用した、Amazon LinuxへのFFmpegインストール用のスクリプトを以下にまとめます。Amazon Linux 2016.09.1で動作を確認しています。また/usr/local/へのインストールを行ないますので適切な権限での実行が必要となります。
#!/bin/sh ## source directory SOURCE_DIR="/usr/local/src/ffmpeg_sources" ## build directory BUILD_DIR="/usr/local/build/ffmpeg_build" ## install directory INSTALL_DIR="/usr/local/bin" ## export PATH PATH=${INSTALL_DIR}':'${PATH} ## Get the Dependencies yum install -y autoconf automake bzip2 cmake freetype-devel gcc gcc-c++ git libtool make mercurial nasm pkgconfig zlib-devel mkdir ${SOURCE_DIR} ## Compilation & Installation ### Yasm cd ${SOURCE_DIR} git clone --depth 1 git://github.com/yasm/yasm.git cd yasm autoreconf -fiv ./configure --prefix="${BUILD_DIR}" --bindir="${INSTALL_DIR}" make make install echo ### libx264 cd ${SOURCE_DIR} git clone --depth 1 git://git.videolan.org/x264 cd x264 PKG_CONFIG_PATH="${BUILD_DIR}/lib/pkgconfig" ./configure --prefix="${BUILD_DIR}" --bindir="${INSTALL_DIR}" --enable-static make make install echo ### libx265 cd ${SOURCE_DIR} hg clone https://bitbucket.org/multicoreware/x265 cd ${SOURCE_DIR}/x265/build/linux cmake -G "Unix Makefiles" -DCMAKE_INSTALL_PREFIX="${BUILD_DIR}" -DENABLE_SHARED:bool=off ../../source make make install echo ### libfdk_aac cd ${SOURCE_DIR} git clone --depth 1 git://git.code.sf.net/p/opencore-amr/fdk-aac cd fdk-aac autoreconf -fiv ./configure --prefix="${BUILD_DIR}" --disable-shared make make install echo ### libmp3lame cd ${SOURCE_DIR} curl -L -O http://downloads.sourceforge.net/project/lame/lame/3.99/lame-3.99.5.tar.gz tar xzvf lame-3.99.5.tar.gz cd lame-3.99.5 ./configure --prefix="${BUILD_DIR}" --bindir="${INSTALL_DIR}" --disable-shared --enable-nasm make make install echo ### libopus cd ${SOURCE_DIR} git clone http://git.opus-codec.org/opus.git cd opus autoreconf -fiv PKG_CONFIG_PATH="${BUILD_DIR}/lib/pkgconfig" ./configure --prefix="${BUILD_DIR}" --disable-shared make make install echo ### libogg cd ${SOURCE_DIR} curl -O http://downloads.xiph.org/releases/ogg/libogg-1.3.2.tar.gz tar xzvf libogg-1.3.2.tar.gz cd libogg-1.3.2 ./configure --prefix="${BUILD_DIR}" --disable-shared make make install echo ### libvorbis cd ${SOURCE_DIR} curl -O http://downloads.xiph.org/releases/vorbis/libvorbis-1.3.4.tar.gz tar xzvf libvorbis-1.3.4.tar.gz cd libvorbis-1.3.4 ./configure --prefix="${BUILD_DIR}" --with-ogg="${BUILD_DIR}" --disable-shared make make install echo ### libvpx cd ${SOURCE_DIR} git clone --depth 1 https://chromium.googlesource.com/webm/libvpx.git cd libvpx ./configure --prefix="${BUILD_DIR}" --disable-examples make make install echo ### FFmpeg cd ${SOURCE_DIR} curl -O http://ffmpeg.org/releases/ffmpeg-snapshot.tar.bz2 tar xjvf ffmpeg-snapshot.tar.bz2 cd ffmpeg PKG_CONFIG_PATH="${BUILD_DIR}/lib/pkgconfig" ./configure --prefix="${BUILD_DIR}" --extra-cflags="-I${BUILD_DIR}/include" --extra-ldflags="-L${BUILD_DIR}/lib -ldl" --bindir="${INSTALL_DIR}" --pkg-config-flags="--static" --enable-gpl --enable-nonfree --enable-libfdk_aac --enable-libfreetype --enable-libmp3lame --enable-libopus --enable-libvorbis --enable-libvpx --enable-libx264 --enable-libx265 make make install hash -r